linestr="A,B;C,D;E,F;A,C,E;B,D,F";circlestr="A,B,C,D;C,D,E,F";{lineset,circleset}=StringSplit[StringSplit[#,";"],","]&/@{linestr,circlestr};(*只保留点数多于4的圆*)circleset=DeleteCases[circleset,Length[#]<4&];(*给定两点,求出通过它们的直线的序号*)
findline[pair_]:=Block[{i=1},While[i<=Length[lineset]&&!SubsetQ[lineset[[i]],pair],i++];If[i==Length[lineset]+1,Nothing,Subscript[l,i]]];isline[pair_]:=AnyTrue[lineset,SubsetQ[#,pair]&];(*创建关联:圆c上的点对{A,B}→圆c的序号.其中A,B满足:直线AB在lineset里面*)assocs=Table[Select[Subsets[circle,{2}],isline],{circle,circleset}];(*创建关联:圆c上的点组{A,{B,C}}→圆c的序号.满足:直线AB,AC都在lineset里面.*)f[{{a_,b_}|{b_,a_},{a_,c_}|{c_,a_}}]:={a,{b,c}};f[_]:=Nothing;(*使用圆周角定理,点A,B在第i个圆上,点A是定点,点B是圆上任意一点,(Subscript[则直线AB的倾斜角l, findline[{A,B}]])(Subscript[和通过圆心和B的直线的倾斜角l, {i,B}])满足,
2(Subscript[l, findline[{A,B}]])-(Subscript[l, {i,B}])=(Subscript[o, i]),
其中,(Subscript[角o, i])只与i有关,与B无关.
这里用Subscript可以方便地生成变量名.*)eqns=Flatten@Table[Apply[Equal,(Function[a,2 findline[a]-Subscript[l,{i,a[[2]]}]]/@Tuples@{{#[[1,1]]},Union@Flatten[Last/@#]}&)/@GatherBy[f/@Subsets[assocs[[i]],2],First],{1}],{i,Length[assocs]}];
(*解方程组,得出直线的倾斜角之间的关系*)
Solve[eqns][[1]]/.((Subscript[l, _?ListQ])->_):>Nothing/.Rule:>Equal/.Subscript[l,a_?NumberQ]:>Subscript[l,lineset[[a]]]